package CompareToThread;
//单线程和多线程的效率对比
public class CompareToSingle {
    public static void main(String[] args) throws InterruptedException{
        //serial();
        /* 对于t1和t2来说,不一定是分布在两个cpu上执行的,
            实际上,t1和t2在执行的过程中,会经历很多次的调度
            这些调度,有些是并发执行的,也有些是并行执行的,另一方面线程调度也是会消耗时间的
            所以并不是就是多线程执行就是单线程执行速度得2倍
        */
        concurrency();
    }
    //单线程执行时间(串行执行)
    public static void serial() {
        long beg = System.currentTimeMillis();
        int a = 0;
        for (long i = 0; i < 100_0000_0000L; i++) {
            a++;
        }
        int b = 0;
        for (long i = 0; i < 100_0000_0000L; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("串行执行时间 : " + (end - beg) + " ms");
    }
    //在cpu上并发执行
    public static void concurrency() throws InterruptedException {
        long beg = System.currentTimeMillis();
        Thread t1 = new Thread(()->{
            int a = 0;
            for (long i = 0; i < 100_0000_0000L; i++) {
                a++;
            }
        });
        Thread t2 = new Thread(()->{
            int b = 0;
            for (long i = 0; i < 100_0000_0000L; i++) {
                b++;
            }
        });
        t1.start();
        t2.start();
        //如果想要获取到最后的时间不能直接这么写,原因是,对于main线程来说,不会等t1和t2执行完成之后猜获取end,而是会直接获取end,此时的时间差为0
        //解决办法:让t1和t2执行完之后在获取end的时间戳
        t1.join();
        t2.join();
        long end = System.currentTimeMillis();
        System.out.println("串行执行时间 : " + (end - beg) + " ms");
    }
}
